package com.iring.service.common;

import java.util.List;

import com.iring.domain.common.User;
import com.iring.vo.sms.SMSCheckVO;
import com.iring.vo.sms.SMSSendVO;
import com.iring.vo.user.AlarmVO;
import com.iring.vo.user.CheckUsernameVO;
import com.iring.vo.user.ImgVO;
import com.iring.vo.user.LoginVO;
import com.iring.vo.user.ModPassVO;
import com.iring.vo.user.PasswordVO;
import com.iring.vo.user.UserInfoVO;
import com.iring.vo.user.UserUpdateVO;

/**
 * @author wanggan
 */
public interface UserService {

    /**
     * 检查本地以及vos的用户名是否存在
     *
     * @param username
     *            用户名
     * @return 检查结果
     */
    Boolean checkUsername(String username);

    User checkUsername(CheckUsernameVO checkUsernameVO, String randomImage);

    /**
     * 根据用户名和密码查找匹配的用户，用于登陆验证，在没有匹配用户的时候返回null
     *
     * @param loginVO
     *            {@link LoginVO}
     * @return 用户信息对象，或者在没有匹配记录的时候返回null
     */
    User findUser(LoginVO loginVO);

    /**
     * 发送验证码
     *
     * @param smsSendVO
     *            {@link SMSSendVO}
     * @return 发送成功返回 true 否则失败
     */
    Boolean sendCode(SMSSendVO smsSendVO);

    /**
     * 添加用户，根据提供的信息创建用户记录，密码会加密后存储，不保存明文，并且返回正式的用户信息
     *
     * @param userInfoVO
     *            提供的用于创建用户记录的信息{@link UserInfoVO}
     * @return 正式的用户信息 {@link User}
     */
    User addUser(UserInfoVO userInfoVO);

    /**
     * 处理异常订单
     *
     * @param username
     *            用户名
     * @param ip
     *          ip地址
     */
    void dealAmoutTask(String username, String ip);

    /**
     * 检查用户账号信息
     *
     * @param username
     *            用户名
     * @param password
     *            密码
     * @return 账号正确返回true，错误返回false
     */
    Boolean checkPbxUserAccount(String username, String password);

    /**
     * 修改密码，验证用户输入的旧密码，密码修改成功返回true
     *
     * @param chPwdInfo
     *            旧密码和新密码等信息 {@link PasswordVO}
     * @param username
     *            用户名
     * @return 密码修改成功返回true，否则false
     */
    Boolean changePassword(PasswordVO chPwdInfo, String username);

    /**
     * 忘记密码发送验证码
     *
     * @param username
     *            用户名
     * @return 发送结果
     */
    Boolean forgetSendCode(String username);

    /**
     * 检验验证码
     *
     * @param SMSCheckVO
     *            验证码
     * @param username
     *            用户名
     * @return 检查结果
     */
    Boolean verifyValidCode(SMSCheckVO SMSCheckVO, String username);

    /**
     * 更改密码
     *
     * @param modPassVO
     *            {@link ModPassVO}
     * @param username
     *          用户名
     * @return 修改成功返回true
     */
    Boolean modifyPassword(ModPassVO modPassVO, String username);

    /**
     * 上传文件，保存成功之后返回true，失败返回false
     *
     * @param imgVO
     *            {@link ImgVO}
     * @param username
     *            用户名
     * @return 成功返回true，否则false
     */
    User uploadHeadImg(ImgVO imgVO, String username);

    /**
     * 更新用户信息
     *
     * @param username
     *            用户名
     * @param userUpdateVO
     *            {@link UserUpdateVO}
     * @return {@link User}
     */
    User updateUser(String username, UserUpdateVO userUpdateVO);

    User isOpenAlarm(String username, AlarmVO alarmVO);

    User getUserByUsername(String username);

    List<User> findUserByRestAmountsLessThanLimit();

    Boolean sendValidCode(SMSSendVO SMSSendVO);

}
